#ifndef __MYSTRING_H_
#define __MYSTRING_H_

#include<iostream>
#include<cstdbool>

class MystringArray;

class Mystring
{
private:
    char *string;
    int size;
    int capacity;
public:
    Mystring();
    //expilicit可以防止隐式转换
    Mystring(const char* str);
    Mystring(const Mystring &s);
    //为什么返回？ 为了能够连续赋值，返回值不能为空 为什么返回引用？ *this返回的是左值，它会拷贝构造，引用可以避免拷贝构造
    Mystring& operator=(const Mystring &s);

    Mystring& operator+=(const Mystring &s);
    Mystring& operator+=(const char &c);
    Mystring operator+(const Mystring &s);

    Mystring& operator-=(const Mystring& s);
    Mystring operator-(const Mystring& s);

    char& operator[](int index);

    bool operator==(const Mystring& s);

    //类型转换运算符重载   
    operator int();
    operator double();

    //字符串切割
    MystringArray split(const Mystring& delim);

    friend std::ostream& operator<<(std::ostream& os, const Mystring& s);
    friend std::istream& operator>>(std::istream& is, Mystring& s);
    friend class MystringArray;

    void clear();
    ~Mystring();
    

};

std::ostream& operator<<(std::ostream& os, const Mystring& s);
std::istream& operator>>(std::istream& is, Mystring& s);


class MystringArray
{
private:
    Mystring *array;
    int size;
    int capacity;
public:
    MystringArray();
    MystringArray(const  MystringArray& str);
    //拷贝构造 =
    MystringArray& operator=(const MystringArray& str);
    MystringArray& operator+=(const Mystring& str);
    MystringArray& operator+=(const char c);
    MystringArray operator+(const Mystring& str);


    MystringArray& operator-=(const Mystring& str);
    MystringArray operator-(const Mystring& str);

    Mystring& operator[](int index);

    friend std::ostream &operator<<(std::ostream &os, const MystringArray &s);
    friend std::istream &operator>>(std::istream &is, MystringArray &s);

    ~MystringArray();
    void show();
};

std::ostream &operator<<(std::ostream &os, const MystringArray &s);
std::istream &operator>>(std::istream &is,  MystringArray &s);

#endif